package admin

import (
	"game-server/app/common/request"
	"game-server/app/common/response"
	adminservices "game-server/app/services/admin"

	"github.com/gin-gonic/gin"
)

// SysRoleAll 获取所有角色
// @Summary 获取所有角色
// @Description 获取系统中所有角色的列表
// @Tags 系统角色
// @Accept json
// @Produce json
// @Router /gameServer/admin/role/all [get]
func SysRoleAll(c *gin.Context) {
	roles, err := adminservices.SysRoleService.GetAllRoles()
	if err != nil {
		response.BusinessFail(c, err.Error())
		return
	}
	response.Success(c, roles)
}

// SysRoleCreate 创建角色
// @Summary 创建角色
// @Description 创建新的系统角色
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param data body request.SysRoleCreateRequest true "角色信息"
// @Router /gameServer/admin/role/create [post]
func SysRoleCreate(c *gin.Context) {
	var form request.SysRoleCreateRequest
	if err := c.ShouldBindJSON(&form); err != nil {
		response.ValidateFail(c, request.GetErrorMsg(form, err))
		return
	}
	role, err := adminservices.SysRoleService.CreateRole(form)
	if err != nil {
		response.BusinessFail(c, err.Error())
		return
	}
	response.Success(c, role)
}

// SysRoleDetail 获取角色详情
// @Summary 获取角色详情
// @Description 根据角色ID获取角色详细信息
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Router /gameServer/admin/role/detail/{id} [get]
func SysRoleDetail(c *gin.Context) {
	id := c.Param("id")
	role, err := adminservices.SysRoleService.GetRoleDetail(id)
	if err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, role)
}

// SysRoleDelete 删除角色
// @Summary 删除角色
// @Description 根据角色ID删除角色
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Router /gameServer/admin/role/delete/{id} [delete]
func SysRoleDelete(c *gin.Context) {
	id := c.Param("id")
	if err := adminservices.SysRoleService.DeleteRole(id); err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, nil)
}

// SysRoleDeleteBatch 批量删除角色
// @Summary 批量删除角色
// @Description 批量删除多个角色
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param data body request.SysRoleBatchDeleteRequest true "角色ID列表"
// @Router /gameServer/admin/role/delete/batch [post]
func SysRoleDeleteBatch(c *gin.Context) {
	var form request.SysRoleBatchDeleteRequest
	if err := c.ShouldBindJSON(&form); err != nil {
		response.ValidateFail(c, request.GetErrorMsg(form, err))
		return
	}

	if err := adminservices.SysRoleService.BatchDeleteRoles(form.IDs); err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, nil)
}

// SysRolePage 角色分页列表
// @Summary 角色分页列表
// @Description 带条件分页查询角色信息
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param data body request.SysRolePageRequest true "查询参数"
// @Router /gameServer/admin/role/page [post]
func SysRolePage(c *gin.Context) {
	var form request.SysRolePageRequest
	if err := c.ShouldBindJSON(&form); err != nil {
		response.ValidateFail(c, request.GetErrorMsg(form, err))
		return
	}

	list, total, err := adminservices.SysRoleService.GetRolePage(form)
	if err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, gin.H{
		"list":  list,
		"total": total,
	})
}

// SysRoleUpdate 更新角色
// @Summary 更新角色
// @Description 更新角色信息
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param data body request.SysRoleUpdateRequest true "角色信息"
// @Router /gameServer/admin/role/update [post]
func SysRoleUpdate(c *gin.Context) {
	var form request.SysRoleUpdateRequest
	if err := c.ShouldBindJSON(&form); err != nil {
		response.ValidateFail(c, request.GetErrorMsg(form, err))
		return
	}

	if err := adminservices.SysRoleService.UpdateRole(form); err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, nil)
}

// SysRoleAssigned 获取用户已分配的角色
// @Summary 获取用户已分配的角色
// @Description 根据用户ID获取已分配的角色列表
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Router /gameServer/admin/role/assigned/{id} [get]
func SysRoleAssigned(c *gin.Context) {
	id := c.Param("id")
	roles, err := adminservices.SysRoleService.GetUserAssignedRoles(id)
	if err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, roles)
}

// SysRoleAssign 给用户分配角色
// @Summary 给用户分配角色
// @Description 更新用户的角色列表
// @Tags 系统角色
// @Accept json
// @Produce json
// @Param data body request.SysRoleAssignRequest true "分配角色信息"
// @Router /gameServer/admin/role/assign [post]
func SysRoleAssign(c *gin.Context) {
	var form request.SysRoleAssignRequest
	if err := c.ShouldBindJSON(&form); err != nil {
		response.ValidateFail(c, request.GetErrorMsg(form, err))
		return
	}

	if err := adminservices.SysRoleService.AssignUserRoles(form); err != nil {
		response.BusinessFail(c, err.Error())
		return
	}

	response.Success(c, nil)
}
